use std::{iter::Peekable, str::Chars};

use crate::error::Error;
use crate::error::Result;

#[derive(Debug, Clone, PartialEq)]
pub enum Token {
    // 关键字
    Keyword(Keyword),
    // 其他类型的字符串Token，比如表名、列名
    Ident(String),
    // 字符串类型的数据
    String(String),
    // 数值类型，比如整数和浮点数
    Number(String),
    // 左括号 (
    OpenParen,
    // 右括号 )
    CloseParen,
    // 逗号 ,
    Comma,
    // 分号 ;
    Semicolon,
    // 星号 & 乘号 *
    Asterisk,
    // 加号 +
    Plus,
    // 减号 -
    Minus,
    // 斜杠 & 除号 /
    Slash,
    // 等号 =
    Equal,
    // 大于
    GreaterThan,
    // 小于
    LessThan,
}

#[derive(Debug, Clone, PartialEq)]
pub enum Keyword {
    Create,
    Table,
    Int,
    Integer,
    Boolean,
    Bool,
    String,
    Text,
    Varchar,
    Float,
    Double,
    Select,
    From,
    Insert,
    Into,
    Values,
    True,
    False,
    Default,
    Not,
    Null,
    Primary,
    Key,
    Update,
    Set,
    Where,
    Delete,
    Order,
    By,
    Asc,
    Desc,
    Limit,
    Offset,
    As,
    Cross,
    Join,
    Left,
    Right,
    On,
    Group,
    Having,
    Begin,
    Commit,
    Rollback,
    Index,
    Explain,
    Drop,
}

pub struct Lexer<'a> {
  // Peekable 可以为迭代器添加peek方法，在不消费下一个元素的情况下查看下一个元素
  iter: Peekable<Chars<'a>>
}

impl<'a> Lexer<'a> {
    pub fn new(input: &'a str) -> Self {
      Lexer {
        iter: input.chars().peekable()
      }
    }

    pub fn scan(&mut self) -> Result<Option<Token>> {
      Ok(None)
    }
}
